/*!
 * \file stomp_comm.h
 *
 * \brief stomp解析 共通模块
 *
 * All Rights Reserved Copyright (C) 2014 broada,Co.,Ltd.\n
 * ct管理用共通函数
 *
 * \version 2.0
 * \author geyh
 * \date 2015/10/12
 *
 */
#ifndef __STOMP_COMM_H_
#define __STOMP_COMM_H_

#include "conntrack.h"
#include "module.h"
#include "frstr.h"
#include "frlist.h"
#include "frreport_comm.h"
#include "frbyte_buffer.h"

typedef struct __st_L7session_stomp_private{

    //session
    char *p_user_name;
    char *p_server;
    char *p_title;
    char arr_session_id[APM_UUID_SIZE];

    int i_data_len;
    int i_receipt;
    int i_report;
    int i_action;
    int i_use_request;
    int i_response_required;
    int is_topic;
    int i_mess_type;
    int i_flag_data_type;                       /*!< 数据类型  LOGIN_START  0 */
    unsigned long ul_seq;

    Frstr *p_str_pre;
    Frstr *p_str_mess;

    Frlist_header *p_lst_comm_tmp;                          /*!< 数据类型  LOGIN_START  0 */
    Frlist_header *p_lst_req_tmp;
    Frlist_header *p_lst_mq_tmp;

    Frreport_body_data *p_st_body_data_req;
    Frreport_body_data *p_st_body_data_resp;

    unsigned int ui_all_len;

    L4_transaction st_l4_trans;
    struct timeval st_login_timestamp;

}L7session_stomp_private;

/*!
 * connect 命令解析  只获取用户名
 *
 * \pp_data_in           (入力参数)
 * \p_i_data_len         (数据长度)
 * \p_st_body_data       (数据上报链表)
 * \p_st_private         (私有数据)
 *
 * \return APM_L7_ANALYZE_FAIL:失败\n
 *         APM_L7_ANALYZE_TODO:数据包解析未结束\n
 *         APM_L7_ANALYZE_SUCC:成功
 *
 */
int stomp_connect_parse(char **pp_data_in, int *p_i_data_len, Frreport_body_data *p_st_body_data, L7session_stomp_private *p_st_private);

/*!
 * connected 命令解析  只获取server
 *
 * \pp_data_in           (入力参数)
 * \p_i_data_len         (数据长度)
 * \p_st_body_data       (数据上报链表)
 * \p_st_private         (私有数据)
 *
 * \return APM_L7_ANALYZE_FAIL:失败\n
 *         APM_L7_ANALYZE_TODO:数据包解析未结束\n
 *         APM_L7_ANALYZE_SUCC:成功
 *
 */
int stomp_connected_parse(char **pp_data_in, int *p_i_data_len, Frreport_body_data *p_st_body_data, L7session_stomp_private *p_st_private);

/*!
 * send 命令解析 获取发送的数据
 *
 * \pp_data_in           (入力参数)
 * \p_i_data_len         (数据长度)
 * \p_st_body_data       (数据上报链表)
 * \p_st_private         (私有数据)
 *
 * \return APM_L7_ANALYZE_FAIL:失败\n
 *         APM_L7_ANALYZE_TODO:数据包解析未结束\n
 *         APM_L7_ANALYZE_SUCC:成功
 *
 */
int stomp_send_parse(char **pp_data_in, int *p_i_data_len, Frreport_body_data *p_st_body_data, L7session_stomp_private *p_st_private);

/*!
 * subscribe 命令解析
 *
 * \pp_data_in           (入力参数)
 * \p_i_data_len         (数据长度)
 * \p_st_body_data       (数据上报链表)
 * \p_st_private         (私有数据)
 *
 * \return APM_L7_ANALYZE_FAIL:失败\n
 *         APM_L7_ANALYZE_TODO:数据包解析未结束\n
 *         APM_L7_ANALYZE_SUCC:成功
 *
 */
int stomp_subscribe_parse(char **pp_data_in, int *p_i_data_len, Frreport_body_data *p_st_body_data, L7session_stomp_private *p_st_private);

/*!
 * message 命令解析  获取推送数据
 *
 * \pp_data_in           (入力参数)
 * \p_i_data_len         (数据长度)
 * \p_st_body_data       (数据上报链表)
 * \p_st_private         (私有数据)
 *
 * \return APM_L7_ANALYZE_FAIL:失败\n
 *         APM_L7_ANALYZE_TODO:数据包解析未结束\n
 *         APM_L7_ANALYZE_SUCC:成功
 *
 */
int stomp_message_parse(char **pp_data_in, int *p_i_data_len, Frreport_body_data *p_st_body_data, L7session_stomp_private *p_st_private);

/*!
 * 其他命令解析  判断是否结束
 *
 * \pp_data_in           (入力参数)
 * \p_i_data_len         (数据长度)
 * \p_st_body_data       (数据上报链表)
 * \p_st_private         (私有数据)
 *
 * \return APM_L7_ANALYZE_FAIL:失败\n
 *         APM_L7_ANALYZE_TODO:数据包解析未结束\n
 *         APM_L7_ANALYZE_SUCC:成功
 *
 */
int stomp_others_parse(char **pp_data_in, int *p_i_data_len, Frreport_body_data *p_st_body_data, L7session_stomp_private *p_st_private);

/*!
 * 取MAP的boolean型数据并添加到链表
 *
 * \p_st_body_data(上报链表)
 * \p_st_data(数据)
 * \p_key(上报key)
 *
 * \return FR_FAIL:失败\n
 *         FR_SUCC:成功
 *
 */
int stomp_get_map_boolean(Frreport_body_data *p_st_body_data
                            , Frbyte_Packet *p_st_data
                            , char *p_key);

/*!
 * 取MAP的char型数据并添加到链表
 *
 * \p_st_body_data(上报链表)
 * \p_st_data(数据)
 * \p_key(上报key)
 *
 * \return FR_FAIL:失败\n
 *         FR_SUCC:成功
 *
 */
int stomp_get_map_char(Frreport_body_data *p_st_body_data
                         , Frbyte_Packet *p_st_data
                         , char *p_key);

/*!
 * 取MAP的short型数据并添加到链表
 *
 * \p_st_body_data(上报链表)
 * \p_st_data(数据)
 * \p_key(上报key)
 *
 * \return FR_FAIL:失败\n
 *         FR_SUCC:成功
 *
 */
int stomp_get_map_short(Frreport_body_data *p_st_body_data
                          , Frbyte_Packet *p_st_data
                          , char *p_key);

/*!
 * 取MAP的int型数据并添加到链表
 *
 * \p_st_body_data(上报链表)
 * \p_st_data(数据)
 * \p_key(上报key)
 *
 * \return FR_FAIL:失败\n
 *         FR_SUCC:成功
 *
 */
int stomp_get_map_int(Frreport_body_data *p_st_body_data
                        , Frbyte_Packet *p_st_data
                        , char *p_key);

/*!
 * 取MAP的long型数据并添加到链表
 *
 * \p_st_body_data(上报链表)
 * \p_st_data(数据)
 * \p_key(上报key)
 *
 * \return FR_FAIL:失败\n
 *         FR_SUCC:成功
 *
 */
int stomp_get_map_long(Frreport_body_data *p_st_body_data
                         , Frbyte_Packet *p_st_data
                         , char *p_key);

/*!
 * 取MAP的float型数据并添加到链表
 *
 * \p_st_body_data(上报链表)
 * \p_st_data(数据)
 * \p_key(上报key)
 *
 * \return FR_FAIL:失败\n
 *         FR_SUCC:成功
 *
 */
int stomp_get_map_float(Frreport_body_data *p_st_body_data
                          , Frbyte_Packet *p_st_data
                          , char *p_key);

/*!
 * 取MAP的double型数据并添加到链表
 *
 * \p_st_body_data(上报链表)
 * \p_st_data(数据)
 * \p_key(上报key)
 *
 * \return FR_FAIL:失败\n
 *         FR_SUCC:成功
 *
 */
int stomp_get_map_double(Frreport_body_data *p_st_body_data
                           , Frbyte_Packet *p_st_data
                           , char *p_key);

/*!
 * 取MAP的byte型数据并添加到链表
 *
 * \p_st_body_data(上报链表)
 * \p_st_data(数据)
 * \p_key(上报key)
 *
 * \return FR_FAIL:失败\n
 *         FR_SUCC:成功
 *
 */
int stomp_get_map_byte(Frreport_body_data *p_st_body_data
                         , Frbyte_Packet *p_st_data
                         , char *p_key);
#endif
